package com.imooc;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * lambda表达式的方法引用
 * @author steve
 * @date 2020/6/10 6:35 上午
 */
public class Test {
    public static void main(String[] args) {
//        存储Person对象的列表
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("tom", "男", 16));
        personList.add(new Person("jerry", "女", 15));
        personList.add(new Person("shuke", "男", 30));
        personList.add(new Person("beita", "女", 26));
        personList.add(new Person("damu", "男", 32));

        //匿名内部类实现方式--列表排序
        Collections.sort(personList, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getAge() - o2.getAge();
            }
        });
        System.out.println(personList);
        //lambda表达式实现
        Collections.sort(personList, (p1,p2) -> p1.getAge()-p2.getAge());
        System.out.println("===========");
        System.out.println(personList);

        /**
         * 静态方法引用的使用
         * 类型名称.方法名称() ---> 类型名称::方法名称
         */
        Collections.sort(personList, Person::compareByAge);
        System.out.println("===========");
        System.out.println(personList);
        System.out.println("===========");

        /**
         * 实例方法引用的使用
         * 类型名称.实例方法名称() ---> 类型名称::实例方法名称
         */
        PersonUtil pu = new PersonUtil();
        Collections.sort(personList,pu::compareByName);
        System.out.println("tom".hashCode());
        System.out.println("jerry".hashCode());
        System.out.println(personList);

        /**
         * 构造方法的引用使用
         * 类型对象的构造过程 ---> 类型名称::new
         */
        IPerson ip = Person::new;
        Person person = ip.initPerson("steve", "male", 33);
        System.out.println(person);


    }

@Data
@NoArgsConstructor
@AllArgsConstructor
static
class Person {
    private String name;    // 姓名
    private String gender;  // 性别
    private int age;        // 年龄

    public static int compareByAge(Person p1, Person p2) {
        return p2.getAge() - p1.getAge();
    }
}


static class PersonUtil {
    // 增加一个实例方法
    public int compareByName(Person p1, Person p2) {
        return p1.getName().hashCode() - p2.getName().hashCode();
    }
}

interface IPerson {
    // 抽象方法：通过指定类型的构造方法初始化对象数据
    Person initPerson(String name, String gender, int age);
}
}
